import os
import subprocess

import requests
from dashscope import ImageSynthesis
from flask import request, json, send_file, Blueprint

from app.kit.file import compress_image, delete_file

node_bp = Blueprint('node', __name__)

# 当前工作路径
current_working_directory = os.getcwd()


def call_node():
    target_directory = "CreateCardTool"
    node_path = os.path.join(current_working_directory, target_directory, 'index.js')
    print("当前工作目录:", current_working_directory)
    command = ["node", node_path]
    try:
        result = subprocess.run(
            command,
            # cwd=target_directory,  # 设置工作目录
            check=True,  # 检查命令执行是否成功
            text=True,  # 以文本模式处理输入输出
            capture_output=True,  # 捕获输出
            encoding='utf-8'  # 指定编码
        )
        print("Command output:", result.stdout)  # 打印标准输出
        print("Command errors:", result.stderr)  # 打印错误输出（如果有）
    except subprocess.CalledProcessError as e:
        print(f"Error: {e}")
        print("Command errors:", e.stderr)
    return True


def prompt_parser(content):
    json_example1 = {
        "background": "#ff00ff",
        "title": "天气",
        "desc": "今日天气小雨有点冷",
        "size": "2x1",
        "dataType": "OTHER",
        "initData": "16℃"
    }
    json_example2 = {
        "background": "#ff00ff",
        "title": "心率",
        "desc": "每日心率数据",
        "size": "2x2",
        "dataType": "HEART_RATE",
        "initData": "71bpm"
    }
    prompt = f"""
    根据文字内容提炼出4个相关信息：1.background、2.title、3.desc、4.size、5.dataType、6.initData
    background使用16进制表示，title最多4个字，desc最多10个字。
    dataType取值有心率（HEART_RATE）、步数（STEP_COUNT）、血氧（SPO2）、血氧（STRESS）、其他（OTHER），
dataType的取值需要根据文字内容判断，如果包含：心率、步数、血氧、血氧等相关内容就使用他们对应的取值，没有就填OTHER，
    initData取值代表当前卡片关键数值，需要加单位，内容要求精炼不能超过5个字，如心率卡片的心率值，跑步卡片的步数值，天气卡片的气温，外卖卡片的送达时间等。
    最后文本格式输出json数据，注意不要使用Markdown格式输出，用纯文本格式输出。json示例：
    {json.dumps(json_example1), json.dumps(json_example2)}。接下来是文字内容：{content}
    注意：返回内容只要json结构数据，其他的都不要。
    """
    return prompt


# 代码下载
@node_bp.route('/code/download', methods=['GET'])
def download():
    file_name = request.args.get("file_name")
    file_path = os.path.join("CardTemplate", "dist", file_name)
    return send_file(file_path, as_attachment=True)


def text_2_image(title, desc):
    prompt = f'主题是{title},{desc}，色彩明亮，内容抽象，没有提到人物，不能生成人物相关内容，内容主体尽量是风景或者事物，要体现{title}的含义。'
    print('绘图：', prompt)
    rsp = ImageSynthesis.call(api_key='sk-82c003cd1867402aa526933c3893f204',
                              model=ImageSynthesis.Models.wanx_v1,
                              prompt=prompt,
                              n=1,
                              style='<anime>',
                              size='1024*1024')
    print('img response: %s' % rsp)
    if rsp.status_code == 200:
        url = rsp.output.results[0].url
        print(url)
        save_image(url)
        return url
    else:
        # todo 兜底
        return ''


def save_image(image_url):
    try:
        # 发送 HTTP GET 请求获取图片
        response = requests.get(image_url, stream=True)
        response.raise_for_status()  # 如果请求失败则抛出异常

        # 将图片写入本地文件
        save_origin_path = os.path.join(current_working_directory, 'CardTemplate', 'temp1', 'src', 'watch3001',
                                        'assets',
                                        'a-origin.png')
        with open(save_origin_path, 'wb') as file:
            for chunk in response.iter_content(1024):
                file.write(chunk)

        print(f"图片已保存到: {save_origin_path}")
        save_path = os.path.join(current_working_directory, 'CardTemplate', 'temp1', 'src', 'watch3001',
                                 'assets',
                                 'a.png')
        # 压缩图片
        compress_image(save_origin_path, save_path)
        delete_file(save_origin_path)
    except requests.exceptions.RequestException as e:
        print(f"下载图片时出错: {e}")
    return True
